#include <iostream>
#include <vector>
#include <string>
#include "set"
// 递归函数来生成笛卡尔积
void cartesianProduct(const std::vector<std::vector<int>>& sets,
                      std::vector<int>& current,
                      int depth,
                      std::vector<std::vector<int>>& result) {
    if (depth == sets.size()) {
        // 如果深度等于集合数量，说明已经生成了一个完整的组合
        result.push_back(current);
        return;
    }

    for (int i = 0; i < sets[depth].size(); ++i) {
        // 选择当前深度的一个元素
        current.push_back(sets[depth][i]);
        // 递归到下一个深度
        cartesianProduct(sets, current, depth + 1, result);
        // 回溯，移除当前选择的元素
        current.pop_back();
    }
}

// 主函数来调用递归函数
std::vector<std::vector<int>> cartesianProduct(const std::vector<std::vector<int>>& sets) {
    std::vector<std::vector<int>> result;
    std::vector<int> current;
    cartesianProduct(sets, current, 0, result);
    return result;
}

int main() {
    // 示例集合
    std::vector<std::vector<int>> sets = {
            {1, 2,3},
            {3, 4,2},
            {5, 6}
    };

    // 获取笛卡尔积
    std::vector<std::vector<int>> result = cartesianProduct(sets);
    std::vector<std::vector<int>> result2;
    // 打印结果
    for (const auto& vec : result) {
        std::set<int> x(vec.begin(),vec.end());
        if(x.size() == vec.size()){ //去重
            result2.push_back(vec);
        }
    }
    // 打印结果
    // 打印结果
    for (const auto& vec : result2) {
        for (int num : vec) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    }
    std::cout << "原始向量大小 " << result.size() << ", 去重后向量大小 :" << result2.size();

    return 0;
}